#pragma once


#include <memory>


#include "kafka_consummer.hpp"
#include "user_action.pb.h"
#include "user_action.pb.cc"
#include "behavior_analytics_redis.h"
#include "redis.h"



namespace lyt {
    class BehaviorAnalytics{
    private:
        BehaviorAnalyticsRedis::ptr _redis;
    public:
        using ptr = std::shared_ptr<BehaviorAnalytics>;
        BehaviorAnalytics(const std::string& host,int port, int db_id,bool keepalive = true){
            _redis = std::make_shared<BehaviorAnalyticsRedis>(redis_build::build(host, port, db_id,keepalive));
        }
        void BehaviorCallBack(std::unique_ptr<RdKafka::Message> msg){
            analytics::BehaviorActionEvent event;
            // 解析payload
            std::string payload(static_cast<const char*>(msg->payload()),msg->len());
            // 将payload反序列化为Protobuf对象
            if(event.ParseFromString(payload)){
                if(event.event_type() == analytics::VIEW){
                    
                }
            }else{
                std::cerr << "[Kafka] Failed to parse protobuf message" << std::endl;
            }
        }
        ~BehaviorAnalytics(){}
    };
    // 提供一个rpc服务的接口，可以通过userid查询到应该给他推荐的文章，


    /**
     * @brief 
        1、拿到用户行为数据
            1.1 插入到redis中，做一个淘汰机制
            1.2 提供一个通过用户id查询最近浏览的文章id
        2、通过拿到的文章id获取文章内容，（这里可以通过id在es中查询文章内容）
        3、通过文章内容，进行向量生成，
        4、通过向量在es中查询内容，

        5、新建博客的时候，不仅要吧博客内容插入到数据库中，还需要通过消息队列异步通知行为分析模块，进行es向量插入

        redis接口
            1.1 插入到redis中，做一个淘汰机制
            1.2 提供一个通过用户id查询最近浏览的文章id

        es接口
            1.插入新文章
            2.通过向量查找

        向量接口
            通过文章生成向量，

     * 
     */

}